/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.hochschild.sgv.dao.impl;

import com.hochschild.sgv.domain.Solicitud;
import com.hochschild.sgv.domain.Usuario;
import com.hochschild.sgv.dao.SolicitudDao;
import com.hochschild.sgv.dao.UsuarioDao;
import com.hochschild.sgv.util.ConexionBD;
import com.hochschild.sgv.util.Constantes;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SolicitudDaoImpl implements SolicitudDao {

    private UsuarioDao usuarioDao;

    public void setUsuarioDao(UsuarioDao usuarioDao) {
        this.usuarioDao = usuarioDao;
    }

    public int getCantSolicitudes() {
        System.out.println("getcantsolicitud");
        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        ResultSet rst = null;
        String SQL = null;
        int max=0;
        //List solicitudes = new ArrayList();
        try {
            conBD = new ConexionBD();
            conn = conBD.getConnection();

            SQL = "SELECT max(idSolicitud) from solicitud  ";
            pstm = conn.prepareStatement(SQL);
            rst = pstm.executeQuery();
            if (rst.next()) {
                max = rst.getInt(1);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (rst != null) {
                try {
                    rst.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

        return max;
    }

    public List<Solicitud> getListaPorUsuarioEstado(String idUsuarioSolicitante, String estado, String estado2, Date fechaInicio) {
        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        ResultSet rst = null;
        String SQL = null;
        Solicitud bean = null;
        List solicitudes = new ArrayList();
        try {
            conBD = new ConexionBD();
            conn = conBD.getConnection();
            SQL = "SELECT * from solicitud  "
                    + "where idUsuarioSolicitante='" + idUsuarioSolicitante + "' "
                    + "and estado in('" + estado + "','" + estado2 + "') and fechainicio>='" + fechaInicio + "'";
            pstm = conn.prepareStatement(SQL);
            rst = pstm.executeQuery();

            while (rst.next()) {
                bean = new Solicitud();
                bean.setIdSolicitud(rst.getInt("idSolicitud"));
                bean.setFechaInicio(rst.getDate("fechaInicio"));
                bean.setFechaFin(rst.getDate("fechaFin"));
                bean.setDiasHabiles(rst.getInt("diasHabiles"));
                bean.setEstado(rst.getString("estado"));
                bean.setIdUsuarioSolicitante(rst.getString("idUsuarioSolicitante"));
                bean.setIdUsuarioAprobador(rst.getString("idUsuarioAprobador"));
                
                Usuario u = new Usuario();
                u.setIdUsuario(rst.getString("idUsuarioSolicitante"));
                u = usuarioDao.getUsuarioById(u);
                bean.setUsuario(u);
                
                Usuario uAprobador = new Usuario();
                uAprobador.setIdPuesto(rst.getString("idUsuarioAprobador"));
                uAprobador= usuarioDao.getUsuarioByIdPuesto(uAprobador);
                bean.setUsuarioAprobador(uAprobador);
                
                solicitudes.add(bean);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (rst != null) {
                try {
                    rst.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

        return solicitudes;
    }

    public List<Solicitud> getListaPorAprobadorEstado(String idPuestoAprobador, String estado) {

        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        ResultSet rst = null;
        String SQL = null;
        Solicitud bean = null;
        List solicitudes = new ArrayList();
        try {
            conBD = new ConexionBD();
            conn = conBD.getConnection();
            SQL = "SELECT * from solicitud where idUsuarioAprobador='" + idPuestoAprobador + "'" + " and estado='" + estado + "'";
            pstm = conn.prepareStatement(SQL);
            rst = pstm.executeQuery();

            while (rst.next()) {
                bean = new Solicitud();
                bean.setIdSolicitud(rst.getInt("idSolicitud"));
                bean.setFechaInicio(rst.getDate("fechaInicio"));
                bean.setFechaFin(rst.getDate("fechaFin"));
                bean.setDiasHabiles(rst.getInt("diasHabiles"));
                bean.setEstado(rst.getString("estado"));
                bean.setIdUsuarioSolicitante(rst.getString("idUsuarioSolicitante"));
                bean.setIdUsuarioAprobador(rst.getString("idUsuarioAprobador"));
                Usuario u = new Usuario();
                u.setIdUsuario(rst.getString("idUsuarioSolicitante"));
                u = usuarioDao.getUsuarioById(u);
                bean.setUsuario(u);
                solicitudes.add(bean);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (rst != null) {
                try {
                    rst.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

         return solicitudes;
    }

    public boolean updateSolicitud(Solicitud bean) {

        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        boolean f_result = true;
        String SQL = null;
        try {
            conBD = new ConexionBD();
            conn = conBD.getConnection();
            
            String solicitud = bean.getMotivoSolicitud();
            if(solicitud != null){
                solicitud = solicitud.replaceAll("'","");
            }
            
            SQL = "UPDATE solicitud"
                    + "   SET estado ='" + bean.getEstado() + "',"
                    + "      motivoSolicitud = '" + solicitud + "'"
                    + " WHERE idUsuarioSolicitante='" + bean.getIdUsuarioSolicitante() + "'"
                    + "  and  idSolicitud='" + bean.getIdSolicitud() + "'";

            pstm = conn.prepareStatement(SQL);
            pstm.executeUpdate();
            conn.setAutoCommit(true);
        } catch (SQLException e) {
            e.printStackTrace();
            f_result = false;
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return f_result;
    }

    
    
      public boolean deleteLogicoSolicitud(Solicitud bean) {

        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        boolean f_result = true;
        String SQL = null;
        try {
            conBD = new ConexionBD();
            conn = conBD.getConnection();
            SQL = "UPDATE solicitud"
                    + "   SET estado ='" + bean.getEstado() + "'"
                    + " WHERE idUsuarioSolicitante='" + bean.getIdUsuarioSolicitante() + "'"
                    + "  and  idSolicitud='" + bean.getIdSolicitud() + "'";

            pstm = conn.prepareStatement(SQL);
            pstm.executeUpdate();
            conn.setAutoCommit(true);
        } catch (SQLException e) {
            e.printStackTrace();
            f_result = false;
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return f_result;
    }
    
    public boolean insertSolicitud(Solicitud bean) {

        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        boolean f_result = true;
        String SQL = null;
        try {

            conBD = new ConexionBD();
            conn = conBD.getConnection();
            SQL = "insert into solicitud (idSolicitud, "
                    + "   fechaInicio, "
                    + "   fechaFin, "
                    + "   diasHabiles, "
                    + "   estado, "
                    + "   idUsuarioSolicitante, "
                    + "   idUsuarioAprobador,tipoSolicitud) values "
                    + " ('" + bean.getIdSolicitud() + "','"
                    + bean.getFechaInicio() + "','"
                    + bean.getFechaFin() + "',"
                    + bean.getDiasHabiles() + ","
                    + "'" + bean.getEstado() + "','"
                    + bean.getIdUsuarioSolicitante() + "',"
                    + "'" + bean.getIdUsuarioAprobador() + "','S')";
            
            pstm = conn.prepareStatement(SQL);
            pstm.executeUpdate();
            conn.setAutoCommit(true);
        } catch (SQLException e) {
            e.printStackTrace();
            f_result = false;
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return f_result;
    }
    
    //Alex
     //          SQL = "SELECT * from solicitud where idUsuarioAprobador='" + idPuestoAprobador + "'" + " and estado='" + estado + "'";
     public int getEstadoSolicitud(Solicitud bean) {
         
        Connection conn = null;
        ConexionBD conBD = null;
        PreparedStatement pstm = null;
        ResultSet rst = null;
        String SQL = null;
        String estado=Constantes.SOLICITUD_POR_APROBAR;
        int max=0;
        List solicitudes = new ArrayList();
        try {
            conBD = new ConexionBD();
            conn = conBD.getConnection();
                
            SQL = "SELECT IDUSUARIOAPROBADOR from solicitud where IDSOLICITUD='" + bean.getIdSolicitud() + "'" + " and estado='" + estado + "'";
           // System.out.println(SQL);
            pstm = conn.prepareStatement(SQL);
            rst = pstm.executeQuery();
            if (rst.next()) {
                max = rst.getInt(1);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (rst != null) {
                try {
                    rst.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SolicitudDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

        return max;
    }
    //Fin Alex
}
